package com.young.mybatis.v2.sqlsource;

import com.young.mybatis.v2.sqlnode.DynamicContext;
import com.young.mybatis.v2.sqlnode.iface.SqlNode;
import com.young.mybatis.v2.sqlsource.iface.SqlSource;
import com.young.mybatis.v2.sqlsource.model.BoundSql;
import com.young.utils.GenericTokenParser;
import com.young.utils.ParameterMappingTokenHandler;

/**
 * 描述:封装不带有${}和动态sql标签的sql信息
 *
 * @author BluceYoung
 * @create 2020-07-04 9:51
 * B站：TeacherYoung凌风
 * www.teacheryoung.com
 */
public class RawSqlSource implements SqlSource {

    private SqlSource sqlSource;

    public RawSqlSource(SqlNode rootSqlNode) {
        //TODO 解析#{}
        //1.处理所有的sqlNode，合并成一条sql语句（#｛｝未处理）
        DynamicContext context=new DynamicContext(null);
        rootSqlNode.apply(context);

        String sqlText = context.getSql();//合并之后的sql，包含#{}
        //2.处理#{}，得到jdbc可执行的sql，以及解析出来的参数集合
        //2.1替换#{}成?
        //2.2 整理参数到集合
        ParameterMappingTokenHandler tokenHandler=new ParameterMappingTokenHandler();
        GenericTokenParser tokenParser=new GenericTokenParser("#{","}",tokenHandler);
        String sql=tokenParser.parse(sqlText);

        //3.讲得到的sql语句和参数信息封装到StaticSqlSource存储
        sqlSource=new StaticSqlSource(sql,tokenHandler.getParameterMappings());
    }

    public BoundSql getBoundSql(Object param) {
        return sqlSource.getBoundSql(param);
    }
}
